#include "MprpcApplication.h"
#include "User.pb.h"
#include "MprpcChannel.h"

#include <iostream>

int main(int argc, char *argv[])
{
    // 整个程序启动以后，要想使用mprpc框架，一定要先调用初始化函数（仅调用一次）
    MprpcApplication::Init(argc, argv);

    // 调用方要定义一个UserServiceRpc_Stub代理对象
    // 其构造函数的实参类型为RpcChannel*，这里的形参继承自RpcChannel*，并重写了其CallMehtod函数，
    // 最终通过多态调用我们编写的MprpcChannel::CallMehtod
    fixbug::UserServiceRpc_Stub stub(new MprpcChannel());

    // 填写rpc方法的请求
    fixbug::LoginRequest request;
    request.set_name("zhang san");
    request.set_pwd("123456");

    // rpc方法的响应
    fixbug::LoginResponse response;

    // 这里最后一个参数google::protobuf::Closure *done，设为了nullptr，因为我们没有采用回调发送，而是在CallMethod直接
    // 编写了tcp的发送 TO PONDER
    // 发起rpc方法的调用，实际经过多态，最终执行MprpcChannel::CallMehtod
    stub.Login(nullptr, &request, &response, nullptr);

    if (0 == response.result().errcode())
    {
        // 调用成功
        std::cout << "rpc Login response success:" << response.success() << std::endl;
    }
    else
    {
        std::cout << "rpc Login response error:" << response.result().errmsg() << std::endl;
    }

    // 远程调用Register方法
    fixbug::RegisterRequest register_request;
    register_request.set_id(2024);
    register_request.set_name("liu bei");
    register_request.set_pwd("123abc");

    fixbug::RegisterResponse register_response;
    stub.Register(nullptr,&register_request,&register_response,nullptr);

    if (0 == register_response.result().errcode())
    {
        // 调用成功
        std::cout << "rpc Register response success:" << register_response.success() << std::endl;
    }
    else
    {
        std::cout << "rpc Register response error:" << register_response.result().errmsg() << std::endl;
    }

    return 0;
}